# 第一节

# 1.变量
# Python 中的变量赋值不需要类型声明。每个变量在内存中创建，都包括变量的标识，名称和数据这些信息。
# 每个变量在使用前都必须赋值，变量赋值以后该变量才会被创建。
# 等号（=）用来给变量赋值。 等号（=）运算符左边是一个变量名,等号（=）运算符右边是存储在变量中的值

age = 22  # 赋值整型变量
price = 1000.0  # 浮点型
name = "Bench"  # 字符串
print("name =" + name, "age =" + str(age), "price =" + str(price))

# 1.1标准数据类型
# python 定义了一些标准类型，用于存储各种类型的数据,Python有五个标准的数据类型
# Numbers（数字）,String（字符串）,List（列表）Tuple（元组）,Dictionary（字典）

# 1.2Python字符串
# python的字串列表有2种取值顺序:
# 1.从左到右索引默认0开始的，最大范围是字符串长度少1
# 2.从右到左索引默认-1开始的，最大范围是字符串开头
#  b  e   n  c  h
#  0  1   2  3  4
# -5 -4  -3 -2 -1
s = 'bench'
print(s[1:3])
# 从字符串中获取一段子字符串的话，可以使用 [头下标:尾下标] 来截取相应的字符串
# [头下标:尾下标] 获取的子字符串包含头下标的字符，但不包含尾下标的字符。

# 输出从第三个字符开始的字符串
print(s[2:])
# 加号（+）是字符串连接运算符，星号（*）是重复操作
print(s * 2)  # benchbench
print(s + " & grape")  # bench & grape

# 1.3 Python 列表 Python 元组
# List（列表） 是 Python 中使用最频繁的数据类型。
print("--------------list和元组------------")
mList = ["bench", "jim", "bob", "tom"]
print(mList)  # 输出完整列表
print(mList[0])  # 输出列表的第一个元素
print(mList[1:3])  # 输出第二个至第三个元素
print(mList * 2)  # 输出列表两次
print(mList + ["北京", "上海", "深圳"])  # 打印组合的列表

# Python 元组
# 元组是另一个数据类型，类似于 List（列表）
# 元组用 () 标识。内部元素用逗号隔开。但是元组不能二次赋值，相当于只读列表。

mAgeTuple = ("海淀", "朝阳", "通州", "顺义", "大兴")
print(mAgeTuple)
print(mAgeTuple[2])
print(mAgeTuple[1:3])
print(mAgeTuple[2:])
print(mAgeTuple * 2)
print(mAgeTuple + ("bench", "tom"))
# 1.4 Python 字典
# 字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合，字典是无序的对象集合。
# 两者之间的区别在于：字典当中的元素是通过键来存取的，而不是通过偏移存取。
# 字典用"{ }"标识。字典由索引(key)和它对应的值value组成。
print("--------------字典------------")
mDict = {"name": "bench", "age": "23", "address": "北京"}
mDict2 = {}
mDict2["telephone"] = "136......."
mDict2["country"] = "中国"
mDict2[4] = "山东"

print(mDict2)
print(mDict2[4])
print(mDict.keys())
print(mDict.values())

# 1.5 Python数据类型之间转换
print("--------------数据类型转换------------")
# int(x [,base])
print(int('01010', 2))  # 将二进制 01010 转换为整数
print(int('0x20', 16))  # 将16进制 0x20 转换为整数
print(int("20", 8))  # 将8进制 20 转换为整数

# 1.6 算术运算符
# 加(+) 减(-) 乘(*) 除(/) 取模(%) 幂(**) 取整(//)
print("--------------算术运算符------------")

m = 10
n = 20
s = 50
res = m + n
# 遇到 error:can only concatenate str (not "int") to str
# 需要在输出的时候讲 int 转换为 str
print("m+n= " + str(m + n))
print("s-n= " + str(s - n))
print("m*n= " + str(m * n))
print("m/n= " + str(m / n))
# m 的 2 次幂
print("m^= " + str(m ** 2))
# 取整
print("s//n= " + str(s // n))
# 1.7 比较运算符 和 赋值运算符
# 比较运算符包括 等于(==) 大于等于(>=) 小于等于(<=) 大于(>)  小于(<) 不等于(!=) 不等于(<>)
# python 3.7 不在支持<>
# 赋值运算符包括: = , += ,-=,*=,/=, **=,//=,%=

print("--------------比较运算符------------")
nn = "海淀"
mm = "朝阳"
if mm == nn:
    print("mm==nn")
else:
    print("mm!=nn")

# 1.8  位运算符 和 逻辑运算符
# 按位与(&)	按位或(|)  按位异或(^) 按位取反(~)	左移(<<)	右移(>>)
# 逻辑运算符:  not  and   or  在没有()的情况下not优先级高于and,and优先级高于or,即优先级关系为()>not>and>or
print("--------------逻辑运算符------------")
tt = 0
rr = 2
ee = 5
if tt > 2 or rr > 11:  # 有一个为真就行
    print("or 判断为真")
else:
    print("or 判断为假")
# 在print输出时，print(x or y ) ,print(x and y) ,会有以下规则
# or x为true(非0则为true)， 则返回 x 否则返回y
print(tt or rr)
print(ee or rr)

# and  x 为true(非0则为true)， 则返回 y， 否则返回x。
print(tt and rr)
print(ee and rr)

# 1.9 成员运算符 和 身份运算符
# 成员运算符
#  in	如果在指定的序列中找到值返回 True，否则返回 False
# not in	如果在指定的序列中没有找到值返回 True，否则返回 False。
print("--------------成员运算符 和 身份运算符------------")
city = ["北京", "上海", "广州", "三亚"]
if "三亚" in city:
    print("三亚在 city 列表")

if "山东" not in city:
    print("山东不在 city 列表")
# 身份运算符
# is 是判断两个标识符是不是引用自一个对象
# is not 是判断两个标识符是不是引用自不同对象
a = 20
b = 20

if a is b:
    print("1 - a 和 b 有相同的标识")
else:
    print("1 - a 和 b 没有相同的标识")

if a is not b:
    print("2 - a 和 b 没有相同的标识")
else:
    print("2 - a 和 b 有相同的标识")

# 修改变量 b 的值
b = 30
if a is b:
    print("3 - a 和 b 有相同的标识")
else:
    print("3 - a 和 b 没有相同的标识")

if a is not b:
    print("4 - a 和 b 没有相同的标识")
else:
    print("4 - a 和 b 有相同的标识")
